DataFrame.to_string と ZipFile.writestr調べた

本題

DataFrameをzipに圧縮したかった

  • 0.17.1でgz化はできるけど、zipはできない
  • 一旦ファイルにしてからzipにするのめんどい
  • ZipFile.writestr という文字列をarchiveに含めることが出来ることを知る
  • DataFrameにto_string という文字列化メソッドがあることを知る

結果としては、to_stringとopen(to_csv).read()は一致しないので、諦めて別の方法で解決した

過程で関係ないけど調べたこと

  • randintとrand_integersの違いを知った(閉区間と開区間)
  • memory上でのzipファイル作成
  • pansas.to_datetime はそれっぽい文字列をparseしてくれる
  • seaborn便利

df_to_str_and_zip_write_str.py

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
np.random.seed(0)

_1_to_3less = np.random.randint(1, 3, size=(7, 5))
_1_to_3less

    array([[1, 2, 2, 1, 2],
           [2, 2, 2, 2, 2],
           [2, 1, 1, 2, 1],
           [1, 1, 1, 1, 2],
           [1, 2, 2, 1, 1],
           [2, 2, 2, 2, 1],
           [2, 1, 2, 1, 2]])


_1_to_3 = np.random.random_integers(1, 3, size=(7, 5))
_1_to_3

    array([[2, 3, 1, 3, 1],
           [2, 2, 3, 1, 2],
           [2, 2, 1, 3, 1],
           [3, 3, 1, 3, 1],
           [1, 1, 2, 2, 3],
           [1, 1, 2, 1, 2],
           [3, 3, 1, 2, 2]])

df = pd.DataFrame(_1_to_3, columns=list("abcde"))
print(df.to_string(index=False, header=False), end="")

     2  3  1  3  1
     2  2  3  1  2
     2  2  1  3  1
     3  3  1  3  1
     1  1  2  2  3
     1  1  2  1  2
     3  3  1  2  2

import io
strio = io.StringIO()
_str = df.to_string(buf=strio)
print(_str)
print(strio.getvalue())
#for l in strio:
#    print(l)
# なぜかread系はFalseになる値が返ってくる, to_string()をStrinIO()に渡せば問題ない…

    None
       a  b  c  d  e
    0  2  3  1  3  1
    1  2  2  3  1  2
    2  2  2  1  3  1
    3  3  3  1  3  1
    4  1  1  2  2  3
    5  1  1  2  1  2
    6  3  3  1  2  2

import os
csv_file = "______.csv"
df.to_csv(csv_file, index=False, header=False)
with open(csv_file) as f:
    print(f.read())

    2,3,1,3,1
    2,2,3,1,2
    2,2,1,3,1
    3,3,1,3,1
    1,1,2,2,3
    1,1,2,1,2
    3,3,1,2,2

# 文字列としての値がfile読み込みと同じであった場合
import zipfile
with zipfile.ZipFile("file.zip", "w", zipfile.ZIP_DEFLATED) as z:
    z.writestr("file.txt", df.to_string())
    z.writestr("depth1/2.txt", "test")

# おまけ1
from contextlib import ExitStack
with ExitStack() as s:
    _bio = s.enter_context(io.BytesIO())
    z = s.enter_context(zipfile.ZipFile(_bio, "w", compression=zipfile.ZIP_DEFLATED))
    z.writestr("a.txt", "aaaa")
    z.writestr("c/d.txt", "ccdd")
    print(_bio.getvalue()[:4])

    b'PK\x03\x04'

# おまけ2
pd.to_datetime("now").date().isoformat()
pd.to_datetime("+1days") # 0.17.1ではエラー以前は文字列のまま返ってくる

# おまけ3
sns.pairplot(data=df, hue="d")

    <seaborn.axisgrid.PairGrid at 0x12094fc88>

![image](DataFrame.to_string と ZipFile.writestr調べた.png)